在这里的App指的不是手机中App的应用
App 就相当于一个功能应用,由多个App组成一个大的Django项目
App的作用: 方便我们在一个大的Django项目中,管理实现不同的业务功能
注意:不使用App也能开发Django项目,但是项目大的时候就不方便管理,所以在创建Django项目的时候我们应该指定一个初始的App
1. 使用命令行创建一个App
# python3 manage.py startapp App名字
python3 manage.py startapp app01
2. 修改配置文件 -> 前提是使用命令行创建App
- 创建一个App后一定要告诉Django我创建了一个App
# settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 在这里添加你所新建的App
# 'app01' # 写法一
'app01.apps.App01Config' # 写法二 官方推荐写法 意思:找到 app01 文件夹下的 apps.py 文件,然后调用该文件下的 App01Config 类
]
3. 使用Pycharm创建项目时随手创建一个App
- 如果是使用Pycharm去创建App,那么是不用修改配置文件,因为Pycharm默认会帮你在配置文件中添加你所创建的App项

4. app的目录结构
app01/
├── migrations # 记录 models.py 中所改动的内容
├── __init__.py
├── 0001_initial.py
└── …….py
├── templatetags # 存放自定义过滤器,simple_tag, inclusion_tag 的文件夹
├── __init__.py
├── app01_filters.py
└── …….py
├── __init__.py
├── admin.py
├── apps.py # app相关的配置项
├── models.py # 存放操作数据库的相关类
├── tests.py # 测试文件
├── views.py # 存放视图函数
5. apps.py 中 Config 类的说明
- ready 方法 -> 当 Config 类有 ready 方法,那么当 App 被加载的时候就会执行ready方法中的代码
from django.apps import AppConfig
class XadminConfig(AppConfig):
name = 'xadmin'
# 当app加载执行的时候,遇到ready方法,就会执行该方法里面的内容
def ready(self):
print(1)
- autodiscover_modules 方法 -> 扫描app根目录下的指定py文件并且执行该文件
from django.apps import AppConfig
from django.utils.module_loading import autodiscover_modules
class XadminConfig(AppConfig):
name = 'xadmin'
# 当app加载执行的时候,遇到ready方法,就会执行该方法里面的内容
def ready(self):
autodiscover_modules('xadmin') # 扫描app根目录下的 xadmin.py 文件并且执行该文件
6. 使用app概念写的登录例子
# settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config' # 告诉Django我创建了一个名叫app01的App
]
# app01 下的 views.py
from django.shortcuts import render
from django.shortcuts import HttpResponse, render, redirect
def login(request):
error_msg = ''
if request.method == 'POST':
email = request.POST.get('email')
password = request.POST.get('password')
if email == '123@qq.com' and password == '123':
return redirect('http://www.baidu.com')
else:
error_msg = '登录失败'
return render(request, 'login.html', {'error_msg': error_msg})
def login2(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'Kevin' and password == '123':
ret = '登录成功'
else:
ret = '登录失败'
return HttpResponse(ret)
return render(request, 'login2.html')
# urls.py -> 写法一
from django.conf.urls import url
from django.contrib import admin
from app01.views import *
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', login),
url(r'^login2/', login2)
]
# urls.py -> 写法二
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^login2/', views.login2)
]